// https://zh-hans.reactjs.org/docs/error-boundaries.html

// componentDidCatch
// getDerivedStateFromError

// 类组件渲染

function updateClassComponent() {
  // if (instance === null) {
  // 初次挂载
  constructClassInstance();
  mountClassInstance();
  // else if() {}
  resumeMountClassInstance();
  // } else {
  // updateClassInstance()
  // }

  const nextUnitOfWork = finishClassComponent();
}

function resumeMountClassInstance() {
  // 处理更新队列 执行到 createClassErrorUpdate 这个方法
  // 得到新的状态 hasError: true
  // processUpdateQueue();
}

function constructClassInstance() {}

function mountClassInstance() {}

function finishClassComponent() {
  // 执行render函数的时候 当渲染children的时候 demo1会执行
  // renderWithHooks执行函数组件的时候发生异常
  // nextChildren = instance.render();
}

// 在beginWork的时候走到catch的分支

let beginWork = () => {
  try {
    // return originalBeginWork(current, unitOfWork, lanes);
  } catch (originalError) {
    // 发生了错误
    // Run beginWork again. 再次执行 beginWork
    // invokeGuardedCallback(null, originalBeginWork, null, current, unitOfWork, lanes);
    // 已经catch了error
    // if (hasCaughtError()) {
    // 这里就会执行到 workLoopSync的catch中
    // handleThrow();
    // }
    // throw originalError;
  }
};

function handleThrow() {
  // markComponentSuspended() // suspended
  markComponentErrored();
}

function markComponentErrored() {}

function unwindSuspendedUnitOfWork() {
  throwException();
  completeUnitOfWork();
}

function throwException() {
  // 标记为 Incomplete
  // sourceFiber.flags |= Incomplete;
  // let value = createCapturedValueAtFiber();
  // renderDidError();
  // workInProgressRootExitStatus = RootErrored;

  // case classComponent
  // workInProgress.flags |= ShouldCapture;
  const update = createClassErrorUpdate();
  // updateQueue
  enqueueCapturedUpdate();
}

// ReactFiberThrow
function createClassErrorUpdate() {
  // 静态属性的方法 update.payload
  // const getDerivedStateFromError = fiber.type.getDerivedStateFromError;
  // componentDidCatch方法
  // this.componentDidCatch(error, {
  //   componentStack: stack !== null ? stack : '',
  // });
}

function enqueueCapturedUpdate() {}

// 完成
function completeUnitOfWork() {
  // unwindWork()
}

function renderRootSync() {
  unwindSuspendedUnitOfWork();
  workLoopSync();
}

function workLoopSync() {
  // performUnitOfWork(workInProgress);
}

// beginWork class ErrorBoundary
